﻿using System;
using System.Collections;
using System.Collections.Generic;
using Iesi.Collections.Generic;
using System.Linq;

using NHibernate;

using Pink.Scheduler.DataAccess.MetadataInfo;

namespace Pink.Scheduler.DataAccess
{

    /// <summary>
    /// Задача
    /// </summary>
	[Serializable]
	public partial class TaskData : ICloneable
	{
		#region Конструкторы
		
        /// <summary>
        /// Конструктор по умолчанию
        /// </summary>
		public TaskData() : base()
        {
        }

		#endregion

		

		#region Копирование
		
        object ICloneable.Clone() { return this.Clone(); }

        /// <summary>
        /// Клонировать объект - глубокое копирование
        /// </summary>
        /// <returns>Клонированный объект</returns>
        public virtual TaskData Clone()
        {
            var result = new TaskData();
            this.CloneTo(result, null, null);
            return result;
        }

        /// <summary>
        /// CheckNeedCopy - вспомогательный метод
        /// </summary>
        /// <returns></returns>
        public virtual TaskData CheckNeedCopy(int? level, Hashtable list)
        {
            if (!(level == null || level > 0))
                return null;
            if (list.Contains(this))
                return (TaskData)list[this];
            var result = new TaskData();
            list.Add(this, result);
            this.CloneTo(result, level - 1, list);
            return result;
        }

        /// <summary>
        /// Клонировать объект - глубоко скопировать текущий объект в выбранный
        /// </summary>
        /// <param name="target">куда копируем</param>
        /// <param name="level">уровень глубины копии</param>
        /// <param name="list">хеш копируемых объектов</param>
        public virtual void CloneTo(TaskData target, int? level, Hashtable list)
        {
            if (list == null)
                list = new Hashtable();
            var result = target as TaskData;
            if (result == null)
                return;
            result.ID = this.ID;
            result.Name = this.Name;
            result.IsEnabled = this.IsEnabled;
            result.TaskClassName = this.TaskClassName;
            result.Assembly = this.Assembly;
            result.ScheduleType = this.ScheduleType;
            result.ScheduleTimeSeconds = this.ScheduleTimeSeconds;
            result.ScheduleDay = this.ScheduleDay;
            result.RetryDelaySeconds = this.RetryDelaySeconds;
            result.RetryWithinSeconds = this.RetryWithinSeconds;
            result.Config = this.Config;
        }

		
		#endregion		
		
		#region Properties
		
        /// <summary>
        /// Идентификатор записи
        /// </summary>
        public const string IDProp = "ID";
        /// <summary>
        /// Идентификатор записи
        /// </summary>
        public virtual string ID
        {
            get; set;
        }
        /// <summary>
        /// Имя задачи
        /// </summary>
        public const string NameProp = "Name";
        /// <summary>
        /// Имя задачи
        /// </summary>
        public virtual string Name
        {
            get; set;
        }
        /// <summary>
        /// Включена ли задача
        /// </summary>
        public const string IsEnabledProp = "IsEnabled";
        /// <summary>
        /// Включена ли задача
        /// </summary>
        public virtual bool IsEnabled
        {
            get; set;
        }
        /// <summary>
        /// Название класса задачи
        /// </summary>
        public const string TaskClassNameProp = "TaskClassName";
        /// <summary>
        /// Название класса задачи
        /// </summary>
        public virtual string TaskClassName
        {
            get; set;
        }
        /// <summary>
        /// Относительный или абсолютный путь к сборке, содержащей класс задачи
        /// </summary>
        public const string AssemblyProp = "Assembly";
        /// <summary>
        /// Относительный или абсолютный путь к сборке, содержащей класс задачи
        /// </summary>
        public virtual string Assembly
        {
            get; set;
        }
        /// <summary>
        /// Тип расписания
        /// </summary>
        public const string ScheduleTypeProp = "ScheduleType";
        /// <summary>
        /// Тип расписания
        /// </summary>
        public virtual Pink.Scheduler.RemoteInterfaces.Enum.ScheduleType ScheduleType
        {
            get; set;
        }
        /// <summary>
        /// В какое время дня выполнять задачу (для периодических - период), секунд
        /// </summary>
        public const string ScheduleTimeSecondsProp = "ScheduleTimeSeconds";
        /// <summary>
        /// В какое время дня выполнять задачу (для периодических - период), секунд
        /// </summary>
        public virtual int ScheduleTimeSeconds
        {
            get; set;
        }
        /// <summary>
        /// В какой день выполнять задачу (для еженедельных и ежемесячных)
        /// </summary>
        public const string ScheduleDayProp = "ScheduleDay";
        /// <summary>
        /// В какой день выполнять задачу (для еженедельных и ежемесячных)
        /// </summary>
        public virtual int? ScheduleDay
        {
            get; set;
        }
        /// <summary>
        /// Задержка перед повторным запуском, секунд
        /// </summary>
        public const string RetryDelaySecondsProp = "RetryDelaySeconds";
        /// <summary>
        /// Задержка перед повторным запуском, секунд
        /// </summary>
        public virtual int? RetryDelaySeconds
        {
            get; set;
        }
        /// <summary>
        /// Сколько времени повторять запуски, секунд
        /// </summary>
        public const string RetryWithinSecondsProp = "RetryWithinSeconds";
        /// <summary>
        /// Сколько времени повторять запуски, секунд
        /// </summary>
        public virtual int? RetryWithinSeconds
        {
            get; set;
        }
        /// <summary>
        /// Настройки задачи
        /// </summary>
        public const string ConfigProp = "Config";
        /// <summary>
        /// Настройки задачи
        /// </summary>
        public virtual string Config
        {
            get; set;
        }		
		#endregion
	}
		
    /// <summary>
    /// Метаданные маппинга
    /// </summary>
	public partial class Metadata
	{
			
        /// <summary>
        /// Задача (Метаданные)
        /// </summary>
        public class TaskDataMetadata : Class
		{
		
            /// <summary>
            /// Конструктор по умолчанию
            /// </summary>
            public TaskDataMetadata() : 
				base("TaskData", "SCHEDULER_TASK") {}
		
		
            /// <summary>
            /// Конструктор
            /// </summary>
            public TaskDataMetadata(string className, string tableName) : base(className, tableName) {}
		

			#region Properties
			
            /// <summary>
            /// 
            /// </summary>
            public readonly Property ID = new Property("ID", "TASK_KEY", typeof(string), 50, true);
            /// <summary>
            /// Имя задачи
            /// </summary>
            public readonly Property Name = new Property("Name", "NAME", typeof(string), 100, true);
            /// <summary>
            /// Включена ли задача
            /// </summary>
            public readonly Property IsEnabled = new Property("IsEnabled", "IS_ENABLED", typeof(bool), null, true);
            /// <summary>
            /// Название класса задачи
            /// </summary>
            public readonly Property TaskClassName = new Property("TaskClassName", "CLASS_NAME", typeof(string), 500, true);
            /// <summary>
            /// Относительный или абсолютный путь к сборке, содержащей класс задачи
            /// </summary>
            public readonly Property Assembly = new Property("Assembly", "[ASSEMBLY]", typeof(string), 500, true);
            /// <summary>
            /// Тип расписания
            /// </summary>
            public readonly Property ScheduleType = new Property("ScheduleType", "SCHEDULE_TYPE", typeof(Pink.Scheduler.RemoteInterfaces.Enum.ScheduleType), null, true);
            /// <summary>
            /// В какое время дня выполнять задачу (для периодических - период), секунд
            /// </summary>
            public readonly Property ScheduleTimeSeconds = new Property("ScheduleTimeSeconds", "SCHEDULE_TIME_SECONDS", typeof(int), null, true);
            /// <summary>
            /// В какой день выполнять задачу (для еженедельных и ежемесячных)
            /// </summary>
            public readonly Property ScheduleDay = new Property("ScheduleDay", "SCHEDULE_DAY", typeof(int), null, false);
            /// <summary>
            /// Задержка перед повторным запуском, секунд
            /// </summary>
            public readonly Property RetryDelaySeconds = new Property("RetryDelaySeconds", "RETRY_DELAY_SECONDS", typeof(int), null, false);
            /// <summary>
            /// Сколько времени повторять запуски, секунд
            /// </summary>
            public readonly Property RetryWithinSeconds = new Property("RetryWithinSeconds", "RETRY_WITHIN_SECONDS", typeof(int), null, false);
            /// <summary>
            /// Настройки задачи
            /// </summary>
            public readonly Property Config = new Property("Config", "CONFIG", typeof(string), 4000, false);
            /// <summary>
            /// Индексатор
            /// </summary>
            /// <param name="propertyName">Имя свойтсва</param>
            /// <returns>Метаданные</returns>
			public override Property this[string propertyName]
			{
				get
				{
					switch (propertyName)
					{
                        case "ID": return ID;
                        case "Name": return Name;
                        case "IsEnabled": return IsEnabled;
                        case "TaskClassName": return TaskClassName;
                        case "Assembly": return Assembly;
                        case "ScheduleType": return ScheduleType;
                        case "ScheduleTimeSeconds": return ScheduleTimeSeconds;
                        case "ScheduleDay": return ScheduleDay;
                        case "RetryDelaySeconds": return RetryDelaySeconds;
                        case "RetryWithinSeconds": return RetryWithinSeconds;
                        case "Config": return Config;
						default: return base[propertyName];
					}
				}
			}
			#endregion
		}			
		
		
        /// <summary>
        /// Задача
        /// </summary>
        public static TaskDataMetadata TaskData = new TaskDataMetadata();		
		
	}	
	
}